<?php
/***************************************************************
*  Copyright notice
*
*  (c) 2011 Florian Müller <it-admin@ifp-potsdam.co>, IFP
*  
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 3 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

/**
 * Veranstaltungen
 */
class Tx_IfpCurriculum2_Domain_Model_Veranstaltung extends Tx_Extbase_DomainObject_AbstractEntity {

	/**
	 * Titel
	 * @var string
	 */
	protected $titel;

	/**
	 * Beschreibung
	 *@json
	 * @var string
	 */
	protected $beschreibung;

	/**
	 * Maximale Teilnehmer Anzahl
	 *
	 * @var integer
	 * @validate NotEmpty
	 */
	protected $maxTeilnehmer;

	/**
	 * Wichtig
	 *
	 * @var boolean
	 */
	protected $hot;

	/**
	 * Externe können sich anmelden
	 *
	 * @var boolean
	 */
	protected $offen;

	/**
	 * Semester
	 *
	 * @var Tx_IfpCurriculum2_Domain_Model_Semester
	 */
	protected $semester;
	/**
	 * Kurs
	 * @var Tx_IfpCurriculum2_Domain_Model_Kurs
	 */
	protected $kurs;
	/**
	 * veranstaltungstage
	 * @cascade remove
	 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_IfpCurriculum2_Domain_Model_Veranstaltungstag>
	 */
	protected $veranstaltungstage;

	/**
	 * Anmeldungen
	 *
	 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_IfpCurriculum2_Domain_Model_Anmeldung>
	 */
	protected $anmeldungen;
	/**
	 * Erstbeginn
	 *
	 * @var DateTime
	 * @validate NotEmpty
	 * 
	 */
	protected $erstbeginn;
	/**
	 * Anmeldefrist
	 *
	 * @var DateTime
	 * @validate NotEmpty
	 * 
	 */
	protected $anmeldefrist;


	public function __construct() {
		//Do not remove the next line: It would break the functionality
		$this->initStorageObjects();
	}

	/**
	 * Initializes all Tx_Extbase_Persistence_ObjectStorage instances.
	 *
	 * @return void
	 */
	protected function initStorageObjects() {
		/**
		* Do not modify this method!
		* It will be rewritten on each save in the kickstarter
		* You may modify the constructor of this class instead
		*/
		$this->anmeldungen = new Tx_Extbase_Persistence_ObjectStorage();
	}

	/**
	 * @param string $titel
	 * @return void
	 */
	public function setTitel($titel) {
		$this->titel = $titel;
	}

	/**
	 * @return string
	 */
	public function getTitel() {
		if($this->titel==""){
			if($this->kurs!=null){
				return $this->kurs->getTitel();
			}else{
				return "kein Titel";
			}
		}else{
			return $this->titel;
		}
	}
	/**
	 * @param Tx_IfpCurriculum2_Domain_Model_Kurs $kurs
	 * @return void
	 */
	public function setKurs(Tx_IfpCurriculum2_Domain_Model_Kurs $kurs) {
		$this->kurs = $kurs;
	}

	/**
	 * @return Tx_IfpCurriculum2_Domain_Model_Kurs
	 */
	public function getKurs() {
		return $this->kurs;
	}
/**
	 * @param DateTime $erstbeginn
	 * @return void
	 */
	public function setErstbeginn(DateTime $erstbeginn) {
		$this->erstbeginn = $erstbeginn;
	}

	/**
	 * @return DateTime
	 */
	public function getErstbeginn() {
		return $this->erstbeginn;
	}
	/**
	 * @param string $beschreibung
	 * @return void
	 */
	public function setBeschreibung($beschreibung) {
		$this->beschreibung = $beschreibung;
	}

	/**
	 * @return string
	 */
	public function getBeschreibung() {
		if($this->beschreibung==""){
			if($this->kurs!=null){
				return $this->kurs->getBeschreibung();
			}else{
				return "kein Beschreibung vorhanden";
			}
		}else{
			
			return $this->beschreibung;
		}
		
	}

	/**
	 * @param integer $maxTeilnehmer
	 * @return void
	 */
	public function setMaxTeilnehmer($maxTeilnehmer) {
		$this->maxTeilnehmer = $maxTeilnehmer;
	}

	/**
	 * @return integer
	 */
	public function getMaxTeilnehmer() {
		return $this->maxTeilnehmer;
	}

	/**
	 * @param boolean $hot
	 * @return void
	 */
	public function setHot($hot) {
		$this->hot = $hot;
	}

	/**
	 * @return boolean
	 */
	public function getHot() {
		return $this->hot;
	}

	/**
	 * @return boolean
	 */
	public function isHot() {
		return $this->getHot();
	}

	/**
	 * @param boolean $offen
	 * @return void
	 */
	public function setOffen($offen) {
		$this->offen = $offen;
	}

	/**
	 * @return boolean
	 */
	public function getOffen() {
		return $this->offen;
	}

	/**
	 * @return boolean
	 */
	public function isOffen() {
		return $this->getOffen();
	}

	/**
	 * @param Tx_IfpCurriculum2_Domain_Model_Semester $semester
	 * @return void
	 */
	public function setSemester(Tx_IfpCurriculum2_Domain_Model_Semester $semester) {
		$this->semester = $semester;
	}

	/**
	 * @return Tx_IfpCurriculum2_Domain_Model_Semester
	 */
	public function getSemester() {
		return $this->semester;
	}

	/**
	 * @param Tx_Extbase_Persistence_ObjectStorage<Tx_IfpCurriculum2_Domain_Model_Veranstaltungstag> $veranstaltungstag
	 * @return void
	 */
	public function setVeranstaltungstage(Tx_Extbase_Persistence_ObjectStorage $veranstaltungstage) {
		$this->veranstaltungstage = $veranstaltungstage;
	}

	/**
	 * @return Tx_Extbase_Persistence_ObjectStorage<Tx_IfpCurriculum2_Domain_Model_Veranstaltungstag>
	 */
	public function getVeranstaltungstage() {
		return $this->veranstaltungstage;
	}

	/**
	 * @param Tx_Extbase_Persistence_ObjectStorage<Tx_IfpCurriculum2_Domain_Model_Anmeldung> $anmeldungen
	 * @return void
	 */
	public function setAnmeldungen(Tx_Extbase_Persistence_ObjectStorage $anmeldungen) {
		$this->anmeldungen = $anmeldungen;
	}

	/**
	 * @return Tx_Extbase_Persistence_ObjectStorage<Tx_IfpCurriculum2_Domain_Model_Anmeldung>
	 */
	public function getAnmeldungen() {
		return $this->anmeldungen;
	}

	/**
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung the Anmeldung to be added
	 * @return void
	 */
	public function addAnmeldungen(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldungen) {
		$this->anmeldungen->attach($anmeldungen);
	}

	/**
	 * @param Tx_IfpCurriculum2_Domain_Model_Anmeldung the Anmeldung to be removed
	 * @return void
	 */
	public function removeAnmeldungen(Tx_IfpCurriculum2_Domain_Model_Anmeldung $anmeldungenToRemove) {
		$this->anmeldungen->detach($anmeldungenToRemove);
	}
	
	public function getFirstBeginn(){
		return $this->veranstaltungstage[0]->getBeginn();
	}
	/**
	 * 
	 * Enter description here ...
	 * @return Tx_IfpCurriculum2_Domain_Model_Veranstaltungsort
	 */
	public function getOrt(){
		return $this->veranstaltungstage[0]->getOrt();
	}
	/**
	 * 
	 * Enter description here ...
	 * return DateTime
	 */
	public function getAnmeldefrist() {
	  return $this->anmeldefrist;
	}
	/**
	 * 
	 * Enter description here ...
	 * @param DateTime $anmeldefrist
	 */
	public function setAnmeldefrist(DateTime $anmeldefrist) {
	  $this->anmeldefrist = $anmeldefrist;
	}
	/**
	 * Anmeldung ist möglich, wenn der aktuelle zeitpunkt vor dem Anmeldeschluss liegt und wenn noch plätze übrig sind.
	 *
	 */
	public function isAnmeldungMoeglich(){
		$date=$this->getAnmeldefrist();
		$date->setTime(0, 0);
		$diff=$this->differenceInDays($date,new DateTime("now"));
		
		
		if($diff>=0&&($this->getCountAnmeldung()<$this->getMaxTeilnehmer()||$this->getMaxTeilnehmer()==0))
			return true;
		return false;
	}
protected  function differenceInDays ($firstDate, $secondDate){
    $firstDateTimeStamp = $firstDate->format("U");
    $secondDateTimeStamp = $secondDate->format("U");
    $rv = round ((($firstDateTimeStamp - $secondDateTimeStamp))/86400);
    return $rv;
}
	public function getCountAnmeldung(){
		$countArray=$this->getAnmeldungen()->toArray();
		$count=0;
		foreach ($countArray as $anmeldung) {
			if(!$anmeldung->isStorniert())
			$count++;
		}
		return $count;
	}
	/**
	 * 
	 * Gibt die gesamten UE einer Veranstaltung zurück;
	 */
	public function getUe(){
		$ue=0;
		foreach ($this->getVeranstaltungstage() as $veranstaltungstag) {
			$ue+=$veranstaltungstag->getUe();
		}
		return $ue;
	}
	/**
	 * 
	 * Enter description here ...
	 * @param unknown_type $veranstaltungstag
	 */
	function init (Tx_IfpCurriculum2_Domain_Model_Veranstaltungstag $veranstaltungstag=NULL){
		$ary=$this->veranstaltungstage->toArray();
		$min=$ary[0]->getBeginn();
		foreach ($ary as $tag) {
		 	if(isset($veranstaltungstag)&&$tag->getUid()==$veranstaltungstag->getUid()){
		 		if($min>$veranstaltungstag->getBeginn()){
					$min=$veranstaltungstag->getBeginn();
				}
			}else{
				if($min>$tag->getBeginn()){
					$min=$tag->getBeginn();
				}
			}
		}
		
		$this->setErstbeginn($min);
		$semesterRepository = t3lib_div::makeInstance('Tx_IfpCurriculum2_Domain_Repository_SemesterRepository');
		$this->setSemester(	$semesterRepository->getSembyTime($min));
		if($this->anmeldefrist==null){
			$this->anmeldefrist = clone $this->erstbeginn;
			$this->anmeldefrist->modify("-2day");
		}
	}
	
}
?>